import store from '@/store'
import axios from 'axios'
import { Message } from 'element-ui'
import util from '@/libs/util'
import router from '@/router'
import loading from '@/libs/loading'
import permission from '@/libs/permission'
// 防止跨域二次访问session不一样
axios.defaults.withCredentials=true;

// 创建一个错误
function errorCreate (msg) {
  const error = new Error(msg)
  errorLog(error)
  throw error
}

// 记录和显示错误
function errorLog (error) {
  // 添加到日志
  store.dispatch('d2admin/log/push', {
    message: '数据请求异常',
    type: 'danger',
    meta: {
      error
    }
  })
  // 打印到控制台
  if (process.env.NODE_ENV === 'development') {
    util.log.danger('>>>>>> Error >>>>>>')
    console.log(error)
  }
  // 显示提示
  Message({
    message: error.message,
    type: 'error',
    duration: 5 * 1000
  })
}

// 创建一个 axios 实例
const service = axios.create({
  baseURL: process.env.VUE_APP_API,
  timeout: 30000 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  config => {
	  // 在请求发送之前做一些处理
	  //处理client_id
	  let getId = util.cookies.get('client')
	  //console.log(getId)
	  if (getId && getId != 'null') {
		  //缓存解码
		  let client_id;
		  let getId2_reverse = getId.substring(0, 6);
		  let getId2 = getId2_reverse.split('').reverse().join(''); //后6位
		  let getId1 = getId.substring(6, 13); //前7位
		  client_id = getId1 + getId2;
		  
		  config.headers['clientId'] = 'client'+client_id; //请求头加client_id
	  } else {
		  //设置client_id，格式为'client'+13位时间戳
		  let id = (new Date().getTime()).toString();
		  
		  //保存格式：13位时间戳=后6位倒序+前7位正序
		  let str;
		  let str1 = id.substring(0, 7); //前7位
		  let str2 = id.substring(7, 13); //后6位
		  let str2_reverse = str2.split('').reverse().join(''); //后6位倒序
		  str = str2_reverse + str1
		  util.cookies.set('client', str);
		  
		  config.headers['clientId'] = 'client'+id; //请求头加client_id
	  }
	 
	  //处理democracy
	  const democracy = util.cookies.get('democracy')
	  if (democracy && democracy != 'null') {
	    config.headers['democracy'] = democracy
	  }
	  
    const token = util.cookies.get('token')
    // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
    // config.headers['X-Token'] = token
    // yanguinan 2019-7-18
    if (typeof (token) !== 'undefined' && token !== null) {
      config.headers['Authorization'] = 'bearer ' + token
      config.headers['Content-Type'] = 'application/json'
    }
    if (!permission.access(config, store)) {
      throw {
        type: '403',
        config: config
      }
    }
    loading.show(config)
    return config
  },
  error => {
    // 发送失败
    console.log(error)
    Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    loading.hide(response.config)
    const headers = response.headers
    if (headers['content-type'] == 'APPLICATION/OCTET-STREAM;charset=UTF-8') {
      return response
    }

    // dataAxios 是 axios 返回数据中的 data
    const dataAxios = response.data
    // 这个状态码是和后端约定的
    const { code } = dataAxios
    // 根据 code 进行判断
    if (code === undefined) {
      // 如果没有 code 代表这不是项目后端开发的接口 比如可能是 D2Admin 请求最新版本
      return dataAxios
    } else {
      // 有 code 代表这是一个后端接口 可以进行进一步的判断
      // console.info(code);
      switch (code) {
        case '000000':
          // [ 示例 ] code === 0 代表没有错误
          return dataAxios
        case '100001':
          // [ 示例 ] 其它和后台约定的 code
          // errorCreate(`[ code: xxx ] ${dataAxios.message}: ${response.config.url}`)
          // 登录超时 - 23001
          var msg = '您登录超时或未登录'
          Message({
              message: msg,
              type: 'error',
              duration: 2 * 1000
          })
          util.cookies.remove('token');
          util.cookies.remove('client')
          util.cookies.remove('democracy')
          setTimeout(() => {
            router.push({
              name: 'login'
            })
            location.reload();
          }, 800)
          break
        default:
          // 不是正确的 code
          errorCreate(`${dataAxios.message}: ${response.config.url}`)
          break
      }
    }
  },
  error => {
    if (error && error.response) {
      loading.hide(error.config)
      switch (error.response.status) {
        case 400: error.message = '请求错误'; break
        case 401: error.message = '未授权，请登录'; break
        case 403: error.message = '拒绝访问'; break
        case 404: error.message = `请求地址出错: ${error.response.config.url}`; break
        case 408: error.message = '请求超时'; break
        case 500: error.message = '服务器内部错误'; break
        case 501: error.message = '服务未实现'; break
        case 502: error.message = '网关错误'; break
        case 503: error.message = '服务不可用'; break
        case 504: error.message = '网关超时'; break
        case 505: error.message = 'HTTP版本不受支持'; break
        default: break
      }
    }
    errorLog(error)
    return Promise.reject(error)
  }
)

export default service
